home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / misc / interfaces3_5.lha / Interfaces / ExecSupport.mod < prev    next >
Text File  |  1994-03-05  |  7KB  |  258 lines

  1. (*
  2. (*
  3. **  Amiga Oberon Interface Module:
  4. **  $VER: ExecSupport.mod 40.15 (28.12.93) Oberon 3.0
  5. **
  6. **   © 1993 by Fridtjof Siebert
  7. *)
  8. *)
  9.  
  10. MODULE ExecSupport;
  11.  
  12. IMPORT e * := Exec,
  13.        ol  := OberonLib,
  14.        sys := SYSTEM;
  15.  
  16. CONST
  17.   TASK = 0;
  18.   STACK = 1;
  19.   NUMENTRIES = 2;
  20.  
  21. TYPE
  22.   FakeMemEntry = STRUCT
  23.                    reqs: LONGSET;
  24.                    length: LONGINT;
  25.                  END;
  26.  
  27.   FakeMemList = STRUCT (node: e.Node)
  28.                   numEntries: INTEGER;
  29.                   me: ARRAY NUMENTRIES OF FakeMemEntry;
  30.                 END;
  31.  
  32. CONST
  33.   TaskMemTemplate = FakeMemList(NIL,NIL,0,0,NIL,    (* node *)
  34.                                 NUMENTRIES,
  35.                                 LONGSET{e.public,e.memClear},
  36.                                 sys.SIZE(e.Task),
  37.                                 LONGSET{e.memClear},
  38.                                 0);
  39.  
  40.  
  41. (*-------------------------------------------------------------------------*)
  42.  
  43.  
  44. PROCEDURE NewList*(VAR list: e.CommonList);
  45. BEGIN
  46.   WITH list: e.MinList DO
  47.     list.head := sys.ADR(list.tail);
  48.     list.tail := NIL;
  49.     list.tailPred := sys.ADR(list.head);
  50.   END;
  51. END NewList;
  52.  
  53.  
  54. PROCEDURE ListEmpty*(VAR list{8}: e.CommonList): BOOLEAN;
  55. BEGIN
  56.   RETURN list(e.MinList).tailPred = sys.ADR(list);
  57. END ListEmpty;
  58.  
  59.  
  60. PROCEDURE NewMinList*(VAR list: e.MinList);
  61. (*
  62.  * obsolete -- use NewList() instead!
  63.  *)
  64. BEGIN
  65.   list.head := sys.ADR(list.tail);
  66.   list.tail := NIL;
  67.   list.tailPred := sys.ADR(list.head);
  68. END NewMinList;
  69.  
  70.  
  71. PROCEDURE MinListEmpty*(VAR list{8}: e.MinList): BOOLEAN;
  72. (*
  73.  * obsolete -- use ListEmpty() instead!
  74.  *)
  75. BEGIN RETURN list.tailPred = sys.ADR(list); END MinListEmpty;
  76.  
  77.  
  78. PROCEDURE IsMsgPortEmpty * (x{8}: e.MsgPortPtr): BOOLEAN;
  79. BEGIN
  80.   RETURN x.msgList.tailPred = x;
  81. END IsMsgPortEmpty;
  82.  
  83.  
  84. (*-------------------------------------------------------------------------*)
  85.  
  86.  
  87. PROCEDURE BeginIO*(ioRequest:e.IORequestPtr);
  88. (*
  89.  * obsolete -- prefer to use Exec.Do/SendIO
  90.  *)
  91. (* $EntryExitCode- *)
  92. BEGIN
  93.   sys.INLINE(
  94.     0226FU, 00004U,            (*   move.l  4(A7),A1                   *)
  95.     02C69U, 00014U,            (*   move.l  20(A1),A6                  *)
  96.     04EAEU, 0FFE2U,            (*   jsr     -30(A6)                    *)
  97.     02257U,                    (*   move.l  (A7),A1                    *)
  98.     0504FU,                    (*   addq    #8,A7                      *)
  99.     04ED1H                     (*   jmp     (A1)                       *)
  100.   ); (* INLINE *)
  101. END BeginIO;
  102.  
  103.  
  104. PROCEDURE AbortIO*(ioRequest:e.IORequestPtr);
  105. (*
  106.  * obsolete -- prefer to use Exec.AbortIO
  107.  *)
  108. (* $EntryExitCode- *)
  109. BEGIN
  110.   sys.INLINE(
  111.     0226FH, 00004H,            (*   move.l  4(A7),A1                   *)
  112.     02C69H, 00014H,            (*   move.l  20(A1),A6                  *)
  113.     04EAEH, 0FFDCH,            (*   jsr     -36(A6)                    *)
  114.     02257H,                    (*   move.l  (A7),A1                    *)
  115.     0504FH,                    (*   addq    #8,A7                      *)
  116.     04ED1H                     (*   jmp     (A1)                       *)
  117.   ); (* INLINE *)
  118. END AbortIO;
  119.  
  120.  
  121. (*-------------------------------------------------------------------------*)
  122.  
  123.  
  124. PROCEDURE CreatePort*(portName:ARRAY OF CHAR;
  125.                       priority:SHORTINT):e.MsgPortPtr; (* $CopyArrays- *)
  126. (* Private Ports werden mit dem Namen "" erzeugt. *)
  127. VAR
  128.   sigBit: SHORTINT;
  129.   Port: e.MsgPortPtr;
  130.   oldmemreqs: LONGSET;
  131.   name: e.APTR;
  132. BEGIN
  133.   sigBit := e.AllocSignal(-1);
  134.   IF sigBit<0 THEN RETURN NIL END;
  135.   oldmemreqs := ol.MemReqs;
  136.   INCL(ol.MemReqs,e.public);
  137.   NEW(Port);
  138.   ol.MemReqs := oldmemreqs;
  139.   IF Port=NIL THEN
  140.     e.FreeSignal(sigBit);
  141.     RETURN NIL
  142.   END;
  143.   IF portName[0]=0X THEN name := NIL ELSE name := sys.ADR(portName) END;
  144.   Port.node.name := name;
  145.   Port.node.pri  := priority;
  146.   Port.node.type := e.msgPort;
  147.   Port.flags     := e.signal;
  148.   Port.sigBit    := sigBit;
  149.   Port.sigTask   := e.FindTask(NIL);
  150.   IF name#NIL THEN e.AddPort(Port)
  151.               ELSE NewList(Port.msgList) END;
  152.   RETURN Port;
  153. END CreatePort;
  154.  
  155.  
  156. PROCEDURE DeletePort*(port:e.MsgPortPtr);
  157. BEGIN
  158.   IF port.node.name#NIL THEN e.RemPort(port) END;
  159.   port.node.type := -1;
  160.   port.msgList.head := sys.VAL(sys.ADDRESS,-1);
  161.   e.FreeSignal(port.sigBit);
  162.   DISPOSE(port);
  163. END DeletePort;
  164.  
  165.  
  166. (*-------------------------------------------------------------------------*)
  167.  
  168.  
  169. PROCEDURE CreateExtIO*(ioReplyPort:e.MsgPortPtr;
  170.                       size:INTEGER): e.APTR;
  171. VAR
  172.   ioReq: e.IORequestPtr;
  173.   oldmemreqs: LONGSET;
  174. BEGIN
  175.   IF ioReplyPort=NIL THEN RETURN NIL END;
  176.   oldmemreqs := ol.MemReqs;
  177.   INCL(ol.MemReqs,e.public);
  178.   ol.New(ioReq,size);
  179.   ol.MemReqs := oldmemreqs;
  180.   IF ioReq=NIL THEN RETURN NIL END;
  181.   ioReq.message.node.type := e.unknown;
  182.   ioReq.message.length := size;
  183.   ioReq.message.replyPort := ioReplyPort;
  184.   RETURN ioReq;
  185. END CreateExtIO;
  186.  
  187.  
  188. PROCEDURE DeleteExtIO*(extIOReq:e.APTR);
  189. BEGIN
  190.   IF extIOReq#NIL THEN DISPOSE(extIOReq) END;
  191. END DeleteExtIO;
  192.  
  193.  
  194. PROCEDURE CreateStdIO*(ioReplyPort:e.MsgPortPtr):e.IOStdReqPtr;
  195. BEGIN
  196.   RETURN CreateExtIO(ioReplyPort,sys.SIZE(e.IOStdReq));
  197. END CreateStdIO;
  198.  
  199.  
  200. PROCEDURE DeleteStdIO*(ioStdReq:e.IOStdReqPtr);
  201. BEGIN
  202.   DeleteExtIO(ioStdReq);
  203. END DeleteStdIO;
  204.  
  205.  
  206. (*-------------------------------------------------------------------------*)
  207.  
  208.  
  209. PROCEDURE CreateTask*(taskName  : ARRAY OF CHAR;
  210.                       priority  : SHORTINT;
  211.                       initPC    : e.PROC;
  212.                       stackSize : LONGINT): e.TaskPtr; (* $CopyArrays- *)
  213. (* If SmallData is used, the tasks userdate is set to SYSTEM.REG(13).
  214.  * As soon as this task accesses global Variables, A5 has to be
  215.  * set using SYSTEM.SETREG(13,Exec.exec.thisTask.userdata).
  216.  *)
  217. VAR
  218.   newTask: e.TaskPtr;
  219.   fakememlist: FakeMemList;
  220.   ml: UNTRACED POINTER TO STRUCT (memList : e.MemList)
  221.                    me: ARRAY NUMENTRIES OF e.MemEntry;
  222.                  END;
  223. BEGIN
  224.   stackSize := sys.VAL(LONGINT,sys.VAL(LONGSET,stackSize + 3) * (-LONGSET{0..1}));
  225.  
  226.   fakememlist := TaskMemTemplate;
  227.   fakememlist.me[STACK].length := stackSize;
  228.  
  229.   ml := e.AllocEntry(sys.ADR(fakememlist));
  230.   IF 31 IN sys.VAL(LONGSET,ml) THEN RETURN NIL END;
  231.  
  232.   newTask := ml.me[TASK].addr;
  233.   newTask.spLower := sys.VAL(LONGINT,ml.me[STACK].addr);
  234.   newTask.spUpper := sys.VAL(LONGINT,newTask.spLower)+stackSize;
  235.   newTask.spReg   := newTask.spUpper;
  236.  
  237.   newTask.node.type := e.task;
  238.   newTask.node.pri  := priority;
  239.   newTask.node.name := sys.ADR(taskName);
  240. (* $IF SmallData *)
  241.   newTask.userData := sys.REG(13);
  242. (* $END *)
  243.  
  244.   NewList(newTask.memEntry);
  245.   e.AddHead(newTask.memEntry,ml);
  246.  
  247.   e.AddTask(newTask,initPC,NIL);
  248.  
  249.   RETURN newTask;
  250.  
  251. END CreateTask;
  252.  
  253.  
  254. PROCEDURE DeleteTask * (t:e.TaskPtr);
  255. BEGIN e.RemTask(t); END DeleteTask;
  256.  
  257. END ExecSupport.
  258.